package com.example;

// 结论：
// 1.父类的私有方法不支持重写
// 2.父类的final方法不支持重写（因为给方法添加final关键字的目的本来就是禁止该方法被子类重写）
// 3.子类中重写方法的返回值可以是基类方法返回值的子类型（这项技术也叫协变返回类型(covariant return type )
// 4.子类可以把重写方法的访问权限放宽，但是子类不能把重写方法的访问权限收窄
class Parent {
    private void privateMethod(){
        System.out.println("Parent 'privateMethod' method called");
    }

    public final void publicFinalMethod(){
        System.out.println("Parent 'publicFinalMethod' method called");
    }

    protected CharSequence protectedMethod(){
        System.out.println("Parent 'protectedMethod' method called, return value type is CharSequence");
        return "CharSequence";
    }

    void packagePrivateMethod(){
        System.out.println("Parent 'packagePrivateMethod' method called");
    }
}
class Child extends Parent {

    // 父类的私有方法不支持重写
    // @Override // java: method does not override or implement a method from a supertype
    // private void privateMethod(){
    //     System.out.println("Child 'privateMethod' method called");
    // }

    // 父类的final方法不支持重写（因为给方法添加final关键字的目的本来就是禁止该方法被子类重写）
    // @Override
    // public final void publicFinalMethod(){
    //     System.out.println("Child 'publicFinalMethod' method called");
    // }

    // 这表示子类中重写方法的返回值可以是基类方法返回值的子类型（这项技术也叫协变返回类型(covariant return type )
    @Override
    protected String protectedMethod(){
        System.out.println("Child 'protectedMethod' method called, return value type is String");
        return "String";
    }

    // 子类可以把重写方法的访问权限放宽
    @Override
    public void packagePrivateMethod() {
        System.out.println("Child 'packagePrivateMethod' method called, child make it public");
    }

    // 子类不能把重写方法的访问权限收窄
    // @Override
    // private void packagePrivateMethod() {
    //     System.out.println("Child 'packagePrivateMethod' method called, child make it private");
    // }
}
public class OverrideTests {
    public static void main(String[] args) {
        Parent p = new Child();
        p.protectedMethod();
        p.packagePrivateMethod();
    }
}
